﻿#define _CRT_SECURE_NO_WARNINGS 1
//C++可以在类的成员函数的参数列表后加上const，用于表示该成员函数不会修改类的成员变量（即 this 指针指向的对象状态）。
//这种用法被称为 ​​常量成员函数（const member function）
#include<iostream>

//权限扩大与权限缩小：
//对于指针和引用才会有这样的概念，再详细说就是，指针指向的内容是否可以通过该指针被更改
//若const T* 传给 T*，那显然是不可以的，这是将本不能更改的指针传为了可以更改，由此发生了权限扩大
//但T* const却可以传给T*，这是因为权限指的是能否通过指针改变内容，与指针指向能否更改无关，
//所以这样传其实是权限平移，不存在扩大

class dzh1
{
public:
	//void Print()//第一个参数this被隐藏，其类型默认为dzh1* const this（顶层const：禁止更改指针指向）
	void Print() const//将第一个参数this的类型由dzh1* const this转化为const dzh1* const this（顶层+底层const）
	{
		std::cout << "void Print() const" << std::endl;
	}
};
int main()
{
	dzh1 a;//a的类型为dzh1
	a.Print();//此时指向a的this指针类型为dzh1* this，
			  //可以作为参数传给类型为dzh1* const this的Print函数，为权限平移

	const dzh1 b;//b的类型为const dzh1
	//b.Print();//->这里是将const dzh1*类型的指针作为参数传递给dzh1 const类型，
	//即由不可通过指针更改内容变为了可以通过指针改变，因此发生了权限扩大，编译错误
	//但想要解决这个问题就需要控制Print第一个参数this指针的类型，但this指针又不显式出现在参数中
	//为此，C++设计了在参数列表后加const的语法来解决这个问题

	//示例
	//void Print() const;//->将Print函数这样写即可使参数this的类型由dzh1* const this转化为const dzh1* const this
	
	//并且由于dzh1*类型传递到const dzh1*是被允许的权限缩小行为，且这样可以显式分辨出那些不需要通过this改变内容的函数，提高代码可读性
	//因此，可以将不需要通过this改变内容的函数都加入const进行限定

	b.Print();
	a.Print();//可以发现，限定之后，a，b均可以使用Print函数

	//int num = 0;
	//int* const pcnum = &num;
	//int* pnum = pcnum;//->此处为不被底层const传给非const修饰，是权限平移
	//const int* cpnum = &num;
	//int* const pcn = cpnum;//->权限扩大，报错
	return 0;
}